﻿/********************************************************************************/
/* 	vector.d																	*/
/*------------------------------------------------------------------------------*/
/*	製作		（　゜ワ゜）ノ　／　松久貫太									*/
/*	製作開始　	2007/05/11														*/
/*	MAIL		omega@personal.email.ne.jp										*/
/*	URL		http://nagoya.cool.ne.jp/o_mega										*/
/*																				*/
/*	このソースは「やらわかライセンス」の元で配布されています。					*/
/*-更新履歴---------------------------------------------------------------------*/
/*	2007/--/--																	*/
/*-その他-----------------------------------------------------------------------*/
/*	なし																		*/
/********************************************************************************/

import std.math;

class Vec3
{
	float x,y,z;
	
	this()
	{
		x = y = z = 0;
	}
	
	this(float x,float y,float z)
	{
		this.x = x;
		this.y = y;
		this.z = z;
	}
	
	this(Vec3 v)
	{
		x = v.x;
		y = v.y;
		z = v.z;
	}
	
	this(float r,float theta)
	{
		x = r * cos(theta);
		y = r * sin(theta);
		z = 0;
	}
	
	void set(Vec3 v)
	{
		this.x = v.x;
		this.y = v.y;
		this.z = v.z;
	}
	
	float opMul(Vec3 v)
	{
		return x * v.x + y * v.y + z * v.z;
	}
	
	Vec3 opMul(float a)
	{
		return new Vec3(x * a , y * a , z * a);
	}
	
	Vec3 opAdd(Vec3 v)
	{
		return new Vec3(x + v.x , y + v.y , z + v.z);
	}
	
	Vec3 opSub(Vec3 v)
	{
		return new Vec3(x - v.x , y - v.y , z - v.z);
	}
	
	void opAddAssign(Vec3 v)
	{
		x += v.x;
		y += v.y;
		z += v.z;
	}
	
	void opSubAssign(Vec3 v)
	{
		x -= v.x;
		y -= v.y;
		z -= v.z;
	}
	
	void opMulAssign(float a)
	{
		x *= a;
		y *= a;
		z *= a;
	}
	
	void opDivAssign(float a)
	{
		x /= a;
		y /= a;
		z /= a;
	}
	
	void blend(Vec3 v1,Vec3 v2,float ratio)
	{
		x = v1.x * ratio + v2.x * (1 - ratio);
		y = v1.y * ratio + v2.y * (1 - ratio);
		z = v1.z * ratio + v2.z * (1 - ratio);
	}
	
	float atan2D()
	{
		return atan2( y , x);
	}
	float atan2D(Vec3 v)
	{
		return atan2(v.y - y , v.x - x);
	}
	
	void toVector2D(float r,float theta)
	{
		x = r * cos(theta);
		y = r * sin(theta);
		z = 0;
	}
	
	float getDistSqrt(Vec3 v)
	{
		float dx = v.x - x;
		float dy = v.y - y;
		return dx * dx + dy * dy;
	}
	
	float getDist(Vec3 v)
	{
		return sqrt(getDistSqrt(v));
	}
	float getDist()
	{
		return sqrt(x * x + y * y);
	}
	
	Vec3 getIndentity()
	{
		float dist = getDist(this);
		return new Vec3(x / dist , y / dist , z / dist);
	}
}

